#ifndef CART_H_
#define CART_H_
#include<Node.h>
#include<vector>
#include<utility>
#include<DecisionTree.h>
using namespace std;
class Cart{
public:
    Cart():epsoion(0.0001),datas(NULL),features(NULL),minData(1){}
    Node* create();
    /**
     * 创建Cart回归树的结点
     */
    Node* createNode(vector<int> index_data,vector<pair<int,double> > splits,double label);
	void setDatas(Datas* datas){this->datas=datas;}
	void setFeatures(vector<Feature>* features){this->features=features;}
    void print(Node* root);
private:
    /**
     * 训练数据
     */
    double epsoion;
    /**
     * 训练数据
     */
    Datas* datas;
    /**
     * 特征
     */
    vector<Feature> * features;
    /**
     * 方差和
     */
    double mse(vector<int> index_data,double label);
    /**
     * 将数据依照特征和s拆分成两个
     */
    void split(vector<int>& index_data,int j,double s,vector<int>& left,vector<int>& right);
    /**
     * 叶子结点最少需要多少训练数据
     */
    int minData;
};
#endif
